﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataTienda;

namespace Kaesoft.Caja.LogicaNegocio
{
    public class CajaParametrizacion
    {
        private StringBuilder builder;
        #region ObtenerCatalogoSummary
        /// <summary>
        /// Obtener catálogos por tipo y con sus hijos
        /// </summary>
        /// <param name="tipoCatalogo">Tipo de catálogo</param>
        /// <returns>Colección de catálogos</returns>
        public List<CatalogoSummary> ObtenerCatalogoSummary(int tipoCatalogo)
        {
            builder = new StringBuilder();
            List<CatalogoSummary> listaCatalogos = null;

            try
            {
                using (var ctx = new tiendaEntities())
                {
                    var todosCatalogos = (from catalogo in ctx.catalogoes
                                          where catalogo.estado == 1
                                          select catalogo).ToList();

                    var query = (from catalogo in ctx.catalogoes
                                 where catalogo.estado == 1
                                 && catalogo.estructuraCatalogoId == tipoCatalogo
                                 select new
                                 {
                                     Codigo = catalogo.codigo,
                                     CodigoCadena = catalogo.codigoCadena,
                                     CodigoTipo = catalogo.estructuraCatalogoId,
                                     CodigoPadre = catalogo.codigoPadre,
                                     CodigoTipoPadre = catalogo.codigoEstructuraPadre,
                                     Descripcion = catalogo.descripcion,
                                     Nombre = catalogo.nombre
                                 });

                    if (query.Count() > 0)
                    {
                        listaCatalogos = new List<CatalogoSummary>();
                        query.ToList().ForEach(catalogo =>
                        {
                            listaCatalogos.Add(new CatalogoSummary()
                            {
                                CodigoCadena = catalogo.CodigoCadena,
                                CodigoTipo = catalogo.CodigoTipo,
                                CodigoPadre = catalogo.CodigoPadre,
                                CodigoTipoPadre = catalogo.CodigoTipoPadre,
                                Descripcion = catalogo.Descripcion,
                                Nombre = catalogo.Nombre
                            });
                        });
                        BuscarCatalogosHijos(listaCatalogos, todosCatalogos);
                    }
                }
            }
            catch (Exception ex)
            {
                Exception e = ex;
                builder.Append("LogicaNegocio - ObtenerCatalogoSummary");
                LogError.Log_Err(builder.ToString(), e);
            }

            return listaCatalogos;
        }
        #endregion
        #region ObtenerParametrosSistema
        /// <summary>
        /// Obtener los parámetros del sistema
        /// </summary>
        /// <returns>Lista de parametros</returns>
        public List<parametro> ObtenerParametrosSistema()
        {
            builder = new StringBuilder();
            List<parametro> listaParametros = null;
            try
            {
                using (var contexto = new tiendaEntities())
                {
                    listaParametros = (from parametro in contexto.parametroes
                                       where parametro.estado == 1
                                       select parametro).ToList();
                }
            }
            catch (Exception ex)
            {
                Exception e = ex;
                builder.Append("LogicaNegocio - ObtenerParametrosSistema");
                LogError.Log_Err(builder.ToString(), e);
            }

            return listaParametros;
        }
        #endregion
        #region ObtenerOpcionesDelSistema
        public List<opcion> ObtenerOpcionesSistema()
        {
            builder = new StringBuilder();
            List<opcion> listaParametros = null;
            try
            {
                using (var contexto = new tiendaEntities())
                {
                    listaParametros = (from opciones in contexto.opcions
                                       where opciones.estado == 1
                                       select opciones).ToList();
                }
            }
            catch (Exception ex)
            {
                Exception e = ex;
                builder.Append("LogicaNegocio - ObtenerParametrosSistema");
                LogError.Log_Err(builder.ToString(), e);
            }

            return listaParametros;
        }
        #endregion
        #region MetodosPrivados
        /// <summary>
        /// Buscar catálogos hijos a partir de un tipo de catálogo
        /// </summary>
        /// <param name="listaCatalogos">Lista filtrada de catalogos por tipo</param>
        /// <param name="todosCatalogos">Todos los catálogos</param>
        private void BuscarCatalogosHijos(IEnumerable<CatalogoSummary> listaCatalogos, List<catalogo> todosCatalogos)
        {
            builder = new StringBuilder();
            try
            {
                foreach (var catalogo in listaCatalogos)
                {
                    var query = (from generico in todosCatalogos
                                 where generico.codigoPadre == catalogo.Codigo
                                    && generico.codigoEstructuraPadre == catalogo.CodigoTipo
                                 select new
                                 {
                                     Codigo = generico.codigo,
                                     CodigoTipo = generico.estructuraCatalogoId,
                                     CodigoTipoPadre = generico.codigoEstructuraPadre,
                                     Descripcion = generico.descripcion,
                                     Nombre = generico.nombre
                                 });

                    if (catalogo.CatalogoHijo == null)
                        catalogo.CatalogoHijo = new List<CatalogoSummary>();

                    if (query.Count() > 0)
                    {
                        query.ToList().ForEach(catHijo =>
                        {
                            catalogo.CatalogoHijo.Add(new CatalogoSummary()
                            {
                                Codigo = catHijo.Codigo,
                                CodigoTipo = catHijo.CodigoTipo,
                                CodigoTipoPadre = catHijo.CodigoTipoPadre,
                                Descripcion = catHijo.Descripcion,
                                Nombre = catHijo.Nombre
                            });
                        });

                        BuscarCatalogosHijos(catalogo.CatalogoHijo, todosCatalogos);
                    }
                }
            }
            catch (Exception ex)
            {
                Exception e = ex;
                builder.Append("LogicaNegocio - BuscarCatalogosHijos");
                LogError.Log_Err(builder.ToString(), e);
            }
        }
        #endregion
    }
}
